// service/menu.service.ts
import { AppDataSource } from '@/config/AppDataSource';
import { CreateMenuDto, UpdateMenuDto } from '@/dto/menu.dto';
import { Menu } from '@/entities/menu.entity';

class MenuService {
    private menuRepository = AppDataSource.getRepository(Menu);

    // 创建菜单
    async create(menuData: CreateMenuDto) {
        const menu = new Menu() as any;
        menu.name = menuData.name;
        menu.parentId = menuData.parentId!;
        menu.path = menuData.path!;
        menu.comment = menuData.comment!;
        menu.sort = menuData.sort!;
        return this.menuRepository.save(menu);
    }
    async update(menuData: UpdateMenuDto) {
        const menu = new Menu() as any;
        menu.id = menuData.id;
        menu.name = menuData.name;
        menu.parentId = menuData.parentId!;
        menu.path = menuData.path!;
        menu.comment = menuData.comment!;
        menu.sort = menuData.sort!;
        return this.menuRepository.save(menu);
    }
    /**
     * 获取树形菜单，后续应该加上搜索功能，且需要保持层级关系
     */
    async getTree(reqData?:{ name?: string }) {
        // 先获取所有菜单（一次性查询）
        const allMenus = await this.menuRepository.find({
            order: { sort: 'ASC' }
        });

        // 在内存中构建树形结构
        return this.buildTree(allMenus);
    }
    private buildTree(menus: Menu[], parentId: number | null = null): Menu[] {
        return menus
            .filter(menu => menu.parentId === parentId)
            .map(menu => ({
                ...menu,
                children: this.buildTree(menus, menu.id) // 递归构建子树
            }));
    }

    // 获取扁平化菜单（带层级信息）
    async getFlatTree() {
        return this.menuRepository.find({
            order: { id: 'ASC' }
        });
    }

    // 删除菜单及其子树
    async delete(id: number) {
        const menu = await this.menuRepository.findOne({
            where: { id },
        });

        if (!menu) throw new Error('菜单不存在');
        const child = await this.menuRepository.findOne({
            where: { parentId:id },
        });
        if (child) throw new Error('存在子菜单，不能删除！');


        return this.menuRepository.remove(menu); // 自动级联删除
    }
}
export default new MenuService()